package com.google.code.gronono.commons.exif;

import java.io.Serializable;
import java.util.Date;

import com.google.code.gronono.commons.i18n.BundleKey;
import com.google.code.gronono.commons.i18n.BundleName;

/**
 * Données EXIF.
 * @author Arnaud BRUNET
 */
@BundleName(value = "com.google.code.gronono.commons.exif")
public class ExifData implements Serializable {
	/** serialVersionUID. */
	private static final long serialVersionUID = 7628415148617647109L;

	/** Description de l'orientation. */
	@BundleKey("orientation.mirror.descr")
	private static String ORIENTATION_MIRROR_DESCR;
	/** Description de l'orientation. */
	@BundleKey("orientation.angle.0.descr")
	private static String ORIENTATION_ANGLE_0_DESCR;
	/** Description de l'orientation. */
	@BundleKey("orientation.angle.90.descr")
	private static String ORIENTATION_ANGLE_90_DESCR;
	/** Description de l'orientation. */
	@BundleKey("orientation.angle.180.descr")
	private static String ORIENTATION_ANGLE_180_DESCR;
	/** Description de l'orientation. */
	@BundleKey("orientation.angle.270.descr")
	private static String ORIENTATION_ANGLE_270_DESCR;

	/** La date de prise de vue de l'image. */
	private Date date;
	/** L'orientation de l'image. */
	private Orientation orientation;
	/** La miniature de l'image. */
	private byte[] thumbnail;

	/**
	 * Donne la date de prise de vue l'image.
	 * @return La date de prise de vue de l'image.
	 */
	public Date getDate() {
		return date;
	}

	/**
	 * Change la date de prise de vue de l'image.
	 * @param date La nouvelle date de prise de vue de l'image.
	 */
	public void setDate(final Date date) {
		this.date = date;
	}

	/**
	 * Donne l'orientation de l'image.
	 * @return L'orientation de l'image.
	 */
	public Orientation getOrientation() {
		return orientation;
	}

	/**
	 * Donne la description d'une orientation.
	 * @return La description de l'orientation.
	 */
	public String getOrientationDescr() {
		switch (orientation) {
			case ANGLE_0: 
				return ORIENTATION_ANGLE_0_DESCR;
			case ANGLE_0_MIRROR: 
				return ORIENTATION_ANGLE_0_DESCR + ORIENTATION_MIRROR_DESCR;
			case ANGLE_90:
				return ORIENTATION_ANGLE_90_DESCR;
			case ANGLE_90_MIRROR:
				return ORIENTATION_ANGLE_90_DESCR + ORIENTATION_MIRROR_DESCR;
			case ANGLE_180:
				return ORIENTATION_ANGLE_180_DESCR;
			case ANGLE_180_MIRROR:
				return ORIENTATION_ANGLE_180_DESCR + ORIENTATION_MIRROR_DESCR;
			case ANGLE_270:
				return ORIENTATION_ANGLE_270_DESCR;
			case ANGLE_270_MIRROR:
				return ORIENTATION_ANGLE_270_DESCR + ORIENTATION_MIRROR_DESCR;
			default:
				return null;
		}
	}

	/**
	 * Change l'orientation de l'image.
	 * @param orientation La nouvelle orientation de l'image.
	 */
	public void setOrientation(final Orientation orientation) {
		this.orientation = orientation;
	}

	/**
	 * Donne la miniature de l'image.
	 * @return La miniature de l'image.
	 */
	public byte[] getThumbnail() {
		return thumbnail;
	}

	/**
	 * Donne la miniature de l'image, redressée selon son <code>Orientation</code>.
	 * @return La miniature de l'image.
	 */
	public byte[] getRotatedThumbnail() {
		return ExifUtils.getRotatedImage(thumbnail, orientation);
	}

	/**
	 * Change la miniature de l'image.
	 * @param thumbnail La nouvelle image miniature.
	 */
	public void setThumbnail(final byte[] thumbnail) {
		this.thumbnail = thumbnail;
	}

}
